Repository navigation
Mute Modes 0.2.2-experimental: SHADOW out of the stock timestretch task's SRAM (owner review) - #1007
Conversation
…nces; source identity
…ge, reviewed table-recipe pins
… regenerated catalogue
…der (no proof involves this module)
…peat98/modwerk#1007 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Zac. The fix is right: the seven operands, the source byte for byte against c5b24d0 and the probe all check out. I'll take it with one more base rebuild. Table owners pin the package hash today, so any Mute Modes byte change needs a new base. I'll open an issue to change that, so later updates don't. The order: #943 and #944 merge first, since they rebuild the base too. Then this one merges main and regenerates its pins. After that I add the 0.2.2 table-owner declaration, the approval record and the new beta base. One thing from your side: |
|
Hi @Zac-Kyoti, a heads-up and a request. #1007 ships as it is (owner's call). After that, Modwerk's base gets a PERSONALIZE rows table ( For Mute Modes that means: OK if I make that change in the base PR? Happy to show the diff first. |
|
Thanks, Jannik. I'll point On the rows table: I'm all for it, since dropping the per-update base rebuild is a clear win. One request on placement: could a row declare where it goes instead of always being appended? For example, an anchor naming the stock row it goes after (MUTE MODE after PREVIEW WITHOUT FX), with catalog order breaking ties when two modules pick the same anchor. LED BRIGHTNESS would stay last as now. MUTE MODE belongs next to MUTE FOCUSES TRK. Putting it at the bottom splits the mute settings across the list, which I think is the wrong UX. It would also put the row in a different place over USB than in the card build, in our own builds and in octabam, which all use index 2. Nothing in the firmware depends on a PERSONALIZE row's index (only the menu code at 0x40068e00..0x40069074 reads the three tables), and the base already splices in front of LED BRIGHTNESS, so an anchored insert should be the same splice. Track Mutes (#931) would probably want to sit with the mute rows too. Happy to look at the diff, and I can help with the anchor part if useful. |
…t, not 0x80006c66 Since 0.2.2 hook 1's SHADOW is a byte inside mm_softmute, so the fixture looks it up per installed package (fixture_image + the package's SHADOW symbol), as it already does for KEYMASK. The plain raw build now gets its symbol file too (plain.syms, already written by the test; argc 12 -> 13). Run locally (private stock MAIN, native archives built from the upstream checkout): passes in 16.5 s. Reading the plain build's SHADOW at the old address instead makes it fail, so the check bites again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pushed 40a7626: |
|
Thanks, Zac, and thanks for the fixture fix: seeding SHADOW at each package's own byte is the right test. On placement: you're right. MUTE MODE should sit with the mute rows, and in the same place over USB as in the card build and in Octabam. I'll give The order is unchanged: #944 merges first, then #1007 takes main and its regenerated pins, then I add the 0.2.2 table-owner declaration and the approval record. |
|
@Zac-Kyoti #944 (Analog BD 0.1.6) is merged, so this is next in the order. It needs current |
|
Thanks, Jannik, the anchor plan sounds great; I'll take a look at #1023 when it's up. Refreshed against main (
|
|
Heads-up: the triage bot will mark this |
|
@repeat98 One more Mute Modes change to raise before you write the 0.2.2 table-owner declaration, since it pins We found a bug in the side-chain exemption (the
On Modwerk this applies whenever a module answers The fix (KEYHOLD) keeps a muted track that has been a KEY cut until it's unmuted. It's one byte beside KEYMASK and five instructions in
Would you like it rolled into #1007 (0.2.2), or sent as 0.2.3 after #1007 merges? Rolling it in means new source, packages, native comparison, probes and a hardware run on a Modwerk image, so your declaration would wait for that. I won't push to the branch until you say which. |
…fter KEY moves away The author's files at Zac-Kyoti/octatrack-kyoti-fw 826d23e (modwerk-modules/mute-modes/); import record sdk/imports/mute-modes-826d23e.json replaces c5b24d0's. SC_KEY unit 1086 -> 1100 B, author reference ac03f559... at 0x400d6e54 (KYOTI V1.7's placement); plain unit unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 native module-owned images match (26 identical outright, 48 outside the platform writes), 88 matching refusals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… OT-exit hold checks (4,353,132 cases), cycle and size figures, test pins 996/1106 B probe.cpp: every unit address and entry offset taken from the new units' symbol tables (plain: mt_trig +370, mt_rebind +460, dt_trig +702, fresh_bind +788, trigflag +910, UNHELD 0x400d77e2, SHADOW 0x400d77e3; SC_KEY: fresh_bind 0x400d71c6, UNHELD 0x400d72a2, SHADOW 0x400d72a3, KEYMASK 0x400d72a4). Hold checks use the inverted byte; frame cases start from UNHELD = 0xff. New checks, both units: an OT frame clears UNHELD and SHADOW; the next soft-mode frame keeps the post-FX cut for every track muted at the OT exit; unmuting some shrinks the hold while new mutes follow MUTE MODE (or KEY); unmuting all releases it. Sabotaging any of the new expectations fails the probe. Worst bound 3,392 -> 3,440 (SC_KEY, OTFX, three instructions); plain frame +9 instructions (2,032 -> 2,176). The table in TESTING.md is regenerated from probes.json; the worst path is labelled OTFX (GATE 3), not OTFX-T. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (hardware pending) Static native build of Sidechain Compressor + Mute Modes, every stock effect kept: MAIN OS d8267756..., mm_softmute (SC_KEY, 1106 B) at 0x400d7280; card file 2e55f106..., syx ef1077cd.... Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ter limit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ce; native comparison (0 mismatches of 162) USB package d8b871e3... unchanged; recipe pins unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t files Only the assets' sourceCommit moved; test_published_module_packages_rebuild_byte_for_byte passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l 212 identical, only moduleSourceTreeSha256 moves Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Compressor + Mute Modes on the author's MKI, all passed), evidence pin Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@repeat98 The OT-exit hold is in, pushed as a fast-forward (
The reds are the same three as before, all waiting on the declaration and the approval record: the base test, the load and stress rows, and the package-rebuild test stopping at Mute Modes' table-owner declaration. The PR body is updated. |
…main, rebuilt next) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ease date - table-owners/mute-modes.recipe.json captured with build.py --octabam-tables mute-modes --capture-stock-recipe (the local build reproduces the committed 0.2.2 package d8b871e3... byte for byte); the declaration names that package, its image, the recipe and the tables at 1332/1400/1468, and table_declarations.validate accepts it. - table-owners.json names the 0.2.2 package and the declaration's reviewed SHA-256 078d3bf2..., approved by repeat98 on 4 Nov 2026. - candidate-recipes.json pins octamod.module.json as committed in 09fe7dc (the evidence pin moved its hash). - sdk/mute-modes-build-approval.json covers 0.2.2's exact native source and waives only the missing stock benchmark and stress rows; no owner unit run. - The changelog entry is dated 4 Nov 2026. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… packages rebuilt from the merge - npm run octatrack:base -- --stock ... --beta --write: base 462fbd2b2ee9... (was 9680e9ac...), its USB Audio variants with it; browser .bin equals build_core.py's. Arena, pool and symbols are unchanged, so the base-bound packages keep their bytes and only their requiredBase moves. - build-modules-isolated.sh from e3a91ff, imported with --development: only the mute-modes version, the source commit and Mute Modes' requested objects change against main's assets. - Tape Echo's and Euclid's standalone recipes re-pinned to the rebuilt asset files; Analog BD's proof header names the new module source tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… build_bus after compose_map tools/remix is again the base's byte for byte, so the reviewed pins over tools/remix/*.py (the standalone recipes, Mute Modes' table declaration on repeat98#1007) do not move with this change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Zac, for KEYHOLD, the OT-exit hold and the MW_MMOH1 run. I've pushed my part to your branch as a fast-forward on top of Yes please to the docs PR you offered for what the guides were missing. One note on the first point: once #1023 lands, a Mute Modes update won't move the table owner or the base any more, so that one can be a single sentence that says so. The other two points still apply: When you have a moment after the release, could you do one USB install of 0.2.2 on your MKI on the beta base (install, Keep, set MUTE MODE, remove)? That would be the first run of the USB package on a unit. It isn't blocking anything. Generated by Claude Code |
…417) main's repeat98#1007 moved the beta base to 462fbd2b. The generated base assets were taken from main and rebuilt on the merged source, so FR 1 sits on main's new base: npm run octatrack:base -- --stock OS.bin --beta --write (base 9b3ba417...), then npm run octatrack:module-packages -- --base-only --stock OS.bin: only requiredBase moved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@repeat98 Happy to do the USB run of Mute Modes 0.2.2 on my MKI (install, Keep, set MUTE MODE, remove). Could you grant beta access to the Zac-Kyoti account on modwerk.app? I don't have the Octatrack page or the base install yet. I'll report the results here once it's done. The docs PR you said yes to is #1251. |
Mute Modes 0.2.2-experimental. This is an author update, but it needs owner review: it touches shared files (the MUTE MODES table recipe pins, two test pins), and the USB base needs your table-owner decision. Details below.
0.2.2 carries three fixes: SHADOW out of the stock timestretch task's SRAM; KEYHOLD (rolled in on 3 Nov at your request, instead of a separate 0.2.3); and the OT-exit hold, which came out of Sam's question on KEYHOLD (sambanks/octabam#1013).
What changed
SHADOW. Hook 1 (
pre, the frame-ISR hook) keeps a one-byte "silenced set", SHADOW. Until 0.2.1 it was SRAM0x80006c66. That address lies inside the work area of a stock ColdFire task that runs the timestretch splice search and transient detection while tracks play, and refills that area with audio on every grain. Bryan T found the static sites; we traced the task.pre's per-frame write landed in the task's splice-search window.SHADOW is now a byte inside
mm_softmute. Every SHADOW operand is absolute long. The plain unit grows 968 → 970 bytes. The source comments name no address the published version did not. octabam has it ata1e0288(sambanks/octabam#928, merged).KEYHOLD (the
SC_KEY/ev_mute_keeppath only, so with Sidechain Compressor installed):Found on sambanks/octabam#934; octabam pinned it with sambanks/octabam#1013.
The OT-exit hold (every unit, with or without Sidechain Compressor):
prereturns beforep1_keythere (Sam's question).The hold byte is inverted (
UNHELD,0xff= nothing held) and sits just before SHADOW. So OT'sclr.b SHADOWbecame oneclr.wover both, and OT keeps its instruction count. The plain unit gets the hold too: 970 → 996 bytes. The SC_KEY unit is 1,106 bytes (1,086 in 0.2.1). octabam pins it with sambanks/octabam#1022.Evidence
bb9bead(modwerk-modules/mute-modes/), byte for byte;sdk/imports/mute-modes-bb9bead.jsonreplacesmute-modes-826d23e.json. Author references: plain64d876ca…at0x400d7400, SC_KEYe622ca6b…at0x400d6e54(KYOTI V1.7's placement), menu4c6702aa…(unchanged).qualification/run.py, reviewed container): 4,353,132 cases pass.probe.cpptakes every unit address from the new units' symbol tables. Frame cases start with UNHELD =0xff(nothing held).MW_MMOH1: the native card image of Sidechain Compressor + Mute Modes with every stock effect kept, built froma2d9882b(MAIN OSd8267756…). All passed:MW_MMKH1(KEYHOLD, before the OT-exit hold): the native card image of Sidechain Compressor + Mute Modes with every stock effect kept, built from52a7586d(MAIN OS2dfce546…). All passed:MW_MM022: the image of this module alone, before KEYHOLD (MAIN OS446ece69…). Every mode, solo in OTFX, 20–30 OTFX mutes of a timestretched loop, Part and project reload, and a power cycle all passed.tests.evidenceRevisionand the hardware record now point ata2d9882b/d8267756…. Limits are intests.qualification.hardware.limitationsand TESTING.md.module:verifyon currentmain: 0 mismatches of 162 selections (74 built, 88 matching refusals).mainand imported. USB package0.2.2-experimental.mwrm: 2,754 B,d8b871e3…. Longest run shared with stock: 10 bytes; nocheck_stock_freehits.--suite analog-bd --static-stock --vendored-sdk, 8 shards, merged in the committed order): all 212 identical, and onlymoduleSourceTreeSha256moves.requested-modules.test.ts, plain unit 970 → 996 B and SC_KEY unit 1086 → 1106 B.main: merged twice on the way (generated asset conflicts only, taken frommain, then rebuilt). Merges only, no rebase, so the evidence commits stay reachable.Needs you
module-adapters/table-owners.jsonstill names the 0.2.1 package and your 14 Oct declaration hash. The 0.2.2 package has a new hash. The declaration, its reviewed SHA-256 and the approval line are yours to make, so I have not regenerated them or the base.octatrack-base.test.tsis red until they are done (npm run octatrack:base -- --stock … --beta --write, then the base-bound packages).module:doctorasks for the frame-interrupt load capture and the 60-second flood run. 0.2.1 shipped with these waived. This version adds a few instructions to the frame path (worst case 3,344 → 3,440 cycles) and nothing elsewhere. Please add an approval record for 0.2.2 covering just those two rows if you agree, or say if you want the emulator runs.Red on this branch, all from 1 and 2:
octatrack-base.test.ts: the committed base is stale.module-doctor.test.mjs: the load and stress rows.test_published_module_packages_rebuild_byte_for_byte: with the Tape Echo and Euclid pins fixed, it now rebuilds every package up to Mute Modes, then stops at "the private cave/table declaration does not name the exact source inputs", which is the 0.2.2 table-owner declaration.pr:readyreports nothing else.The release boxes are left unticked, because this is not an automatic update. When it is published, followers are notified after the 48-hour hold.
What the guides lacked: nothing in ADD_A_MODULE or MODULE_AUTHOR_UPDATES says that a Mute Modes source change also changes
candidate-recipes.jsonand the reviewed table owner, and therefore the base, which makes every Mute Modes update owner-reviewed. Also, a module'squalification/probe.cppcounts as native source, so a probe-only change moves the qualification hash; and the probe needs mc68k mounted into the container and an exec-enabled/tmp. I can send a docs PR for these.🤖 Generated with Claude Code